home *** CD-ROM | disk | FTP | other *** search
/ Hobby PC 15 / Hobby PC 15.iso / Soft / Blender / blender.exe / ic255.cab / python / povexport.py < prev    next >
Text File  |  2001-03-15  |  16KB  |  315 lines

  1. #######################
  2. # (c) Jan Walter 2000 #
  3. #######################
  4.  
  5. # CVS
  6. # $Author: jan $
  7. # $Date: 2001/01/08 12:31:15 $
  8. # $RCSfile: povexport.py,v $
  9. # $Revision: 1.1 $
  10.  
  11. import Blender
  12. import math
  13. import string
  14.  
  15. exportAnimations = 1
  16.  
  17. class PovrayExport:
  18.     def __init__(self, filename):
  19.         self.filename = filename
  20.         self.file    = None
  21.         self.scene   = None
  22.         self.display = None
  23.         self.lampNames = []
  24.         self.meshNames = []
  25.         self.materialNames = []
  26.  
  27.     def export(self, scene):
  28.         global exportAnimations
  29.  
  30.         print "exporting ..."
  31.         self.scene = scene
  32.         self.display = Blender.getDisplaySettings()
  33.         file = open("povsize.ini", "w")
  34.         file.write("Width=%s\n" % self.display.xResolution)
  35.         file.write("Height=%s\n" % self.display.yResolution)
  36.         file.close()
  37.         if exportAnimations:
  38.             for frame in xrange(self.display.startFrame,
  39.                                 self.display.endFrame + 1):
  40.                 self.writeFrame(frame)
  41.         else:
  42.             self.writeFrame(self.display.currentFrame)
  43.         self.writeEnd()
  44.  
  45.     def writeCamera(self):
  46.         camobj = self.scene.getCurrentCamera()
  47.         camera = Blender.getCamera(camobj.data)
  48.         angle = 360.0 * math.atan(16.0 / camera.Lens) / math.pi
  49.         self.file.write("camera {\n")
  50.         self.file.write("    right <-%s, 0, 0>\n" %
  51.                         (self.display.xResolution /
  52.                          float(self.display.yResolution)))
  53.         self.file.write("    up    <0, 1, 0>\n")
  54.         self.file.write("    angle %s\n" % angle)
  55.         self.file.write("    rotate <%s, %s, %s>\n" % (0, 180, 0))
  56.         self.file.write("}\n")
  57.  
  58.     def writeData(self, name):
  59.         if Blender.isLamp(name):
  60.             lampobj = Blender.getObject(name)
  61.             lamp    = Blender.getLamp(lampobj.data)
  62.             if lampobj.data not in self.lampNames:
  63.                 self.lampNames.append(lampobj.data)
  64.                 self.writeIdentifier(lampobj.data)
  65.                 povname = string.replace(lampobj.data, ".", "_")
  66.                 povname = string.upper(povname)
  67.                 self.file.write("#declare %s = light_source {\n" % povname)
  68.                 self.file.write("    <0, 0, 0>\n")
  69.                 self.file.write("    color rgb <%s, %s, %s>\n" %
  70.                                 (lamp.R, lamp.G, lamp.B))
  71.                 self.file.write("}\n")
  72.         elif Blender.isMesh(name):
  73.             meshobj = Blender.getObject(name)
  74.             mesh    = Blender.getMesh(meshobj.data)
  75.             if meshobj.data not in self.meshNames:
  76.                 self.meshNames.append(meshobj.data)
  77.                 self.writeIdentifier(meshobj.data)
  78.                 povname = string.replace(meshobj.data, ".", "_")
  79.                 povname = string.upper(povname)
  80.                 self.file.write("#declare %s = mesh {\n" % povname)
  81.                 for face in mesh.faces:
  82.                     if face[4]: # smooth
  83.                         # first triangle
  84.                         self.file.write("    smooth_triangle {\n")
  85.                         self.file.write("        <%s, %s, %s>,\n" %
  86.                                         (mesh.vertices[face[0]][0],
  87.                                          mesh.vertices[face[0]][1],
  88.                                          mesh.vertices[face[0]][2]))
  89.                         self.file.write("        <%s, %s, %s>,\n" %
  90.                                         (mesh.normals[face[0]][0],
  91.                                          mesh.normals[face[0]][1],
  92.                                          mesh.normals[face[0]][2]))
  93.                         self.file.write("        <%s, %s, %s>,\n" %
  94.                                         (mesh.vertices[face[1]][0],
  95.                                          mesh.vertices[face[1]][1],
  96.                                          mesh.vertices[face[1]][2]))
  97.                         self.file.write("        <%s, %s, %s>,\n" %
  98.                                         (mesh.normals[face[1]][0],
  99.                                          mesh.normals[face[1]][1],
  100.                                          mesh.normals[face[1]][2]))
  101.                         self.file.write("        <%s, %s, %s>,\n" %
  102.                                         (mesh.vertices[face[2]][0],
  103.                                          mesh.vertices[face[2]][1],
  104.                                          mesh.vertices[face[2]][2]))
  105.                         self.file.write("        <%s, %s, %s>\n" %
  106.                                         (mesh.normals[face[2]][0],
  107.                                          mesh.normals[face[2]][1],
  108.                                          mesh.normals[face[2]][2]))
  109.                         # material
  110.                         if meshobj.materials and meshobj.materials[face[5]]:
  111.                             povname = meshobj.materials[face[5]]
  112.                             povname = string.replace(povname, ".", "_")
  113.                             povname = "MA" + string.upper(povname)
  114.                             self.file.write("        texture { %s }\n" %
  115.                                             povname)
  116.                         self.file.write("    }\n")
  117.                         if face[3]:
  118.                             # second triangle
  119.                             self.file.write("    smooth_triangle {\n")
  120.                             self.file.write("        <%s, %s, %s>,\n" %
  121.                                             (mesh.vertices[face[0]][0],
  122.                                              mesh.vertices[face[0]][1],
  123.                                              mesh.vertices[face[0]][2]))
  124.                             self.file.write("        <%s, %s, %s>,\n" %
  125.                                             (mesh.normals[face[0]][0],
  126.                                              mesh.normals[face[0]][1],
  127.                                              mesh.normals[face[0]][2]))
  128.                             self.file.write("        <%s, %s, %s>,\n" %
  129.                                             (mesh.vertices[face[2]][0],
  130.                                              mesh.vertices[face[2]][1],
  131.                                              mesh.vertices[face[2]][2]))
  132.                             self.file.write("        <%s, %s, %s>,\n" %
  133.                                             (mesh.normals[face[2]][0],
  134.                                              mesh.normals[face[2]][1],
  135.                                              mesh.normals[face[2]][2]))
  136.                             self.file.write("        <%s, %s, %s>,\n" %
  137.                                             (mesh.vertices[face[3]][0],
  138.                                              mesh.vertices[face[3]][1],
  139.                                              mesh.vertices[face[3]][2]))
  140.                             self.file.write("        <%s, %s, %s>\n" %
  141.                                             (mesh.normals[face[3]][0],
  142.                                              mesh.normals[face[3]][1],
  143.                                              mesh.normals[face[3]][2]))
  144.                             # material
  145.                             if (meshobj.materials and
  146.                                 meshobj.materials[face[5]]):
  147.                                 povname = meshobj.materials[face[5]]
  148.                                 povname = string.replace(povname, ".", "_")
  149.                                 povname = "MA" + string.upper(povname)
  150.                                 self.file.write("        texture { %s }\n" %
  151.                                                 povname)
  152.                             self.file.write("    }\n")
  153.                     else:
  154.                         # first triangle
  155.                         self.file.write("    triangle {\n")
  156.                         self.file.write("        <%s, %s, %s>,\n" %
  157.                                         (mesh.vertices[face[0]][0],
  158.                                          mesh.vertices[face[0]][1],
  159.                                          mesh.vertices[face[0]][2]))
  160.                         self.file.write("        <%s, %s, %s>,\n" %
  161.                                         (mesh.vertices[face[1]][0],
  162.                                          mesh.vertices[face[1]][1],
  163.                                          mesh.vertices[face[1]][2]))
  164.                         self.file.write("        <%s, %s, %s>\n" %
  165.                                         (mesh.vertices[face[2]][0],
  166.                                          mesh.vertices[face[2]][1],
  167.                                          mesh.vertices[face[2]][2]))
  168.                         # material
  169.                         if meshobj.materials and meshobj.materials[face[5]]:
  170.                             povname = meshobj.materials[face[5]]
  171.                             povname = string.replace(povname, ".", "_")
  172.                             povname = "MA" + string.upper(povname)
  173.                             self.file.write("        texture { %s }\n" %
  174.                                             povname)
  175.                         self.file.write("    }\n")
  176.                         if face[3]:
  177.                             # second triangle
  178.                             self.file.write("    triangle {\n")
  179.                             self.file.write("        <%s, %s, %s>,\n" %
  180.                                             (mesh.vertices[face[0]][0],
  181.                                              mesh.vertices[face[0]][1],
  182.                                              mesh.vertices[face[0]][2]))
  183.                             self.file.write("        <%s, %s, %s>,\n" %
  184.                                             (mesh.vertices[face[2]][0],
  185.                                              mesh.vertices[face[2]][1],
  186.                                              mesh.vertices[face[2]][2]))
  187.                             self.file.write("        <%s, %s, %s>\n" %
  188.                                             (mesh.vertices[face[3]][0],
  189.                                              mesh.vertices[face[3]][1],
  190.                                              mesh.vertices[face[3]][2]))
  191.                             # material
  192.                             if (meshobj.materials and
  193.                                 meshobj.materials[face[5]]):
  194.                                 povname = meshobj.materials[face[5]]
  195.                                 povname = string.replace(povname, ".", "_")
  196.                                 povname = "MA" + string.upper(povname)
  197.                                 self.file.write("        texture { %s }\n" %
  198.                                                 povname)
  199.                             self.file.write("    }\n")
  200.                 self.file.write("}\n")
  201.         else:
  202.             print "Sorry can export meshes only ..."
  203.  
  204.     def writeEnd(self):
  205.         print "... finished"
  206.  
  207.     def writeFrame(self, frame):
  208.         self.lampNames = []
  209.         self.meshNames = []
  210.         self.materialNames = []
  211.         print "frame:", frame
  212.         Blender.setCurrentFrame(frame)
  213.         self.file = open(self.filename + "%04d.pov" % frame, "w")
  214.         self.writeHeader()
  215.         self.writeCamera()
  216.         self.writeWorld()
  217.         self.file.close()
  218.  
  219.     def writeHeader(self):
  220.         self.file.write('#include "%s"\n' % "finish.inc")
  221.  
  222.     def writeIdentifier(self, name):
  223.         self.file.write("// %s\n" % name)
  224.  
  225.     def writeMaterial(self, name):
  226.         if Blender.isMesh(name):
  227.             object = Blender.getObject(name)
  228.             for matName in object.materials:
  229.                 # materials can be shared !!!
  230.                 if matName not in self.materialNames:
  231.                     self.materialNames.append(matName)
  232.                     self.writeIdentifier(matName)
  233.                     material = Blender.getMaterial(matName)
  234.                     povname = string.replace(matName, ".", "_")
  235.                     povname = "MA" + string.upper(povname)
  236.                     self.file.write("#declare %s = texture {\n" % povname)
  237.                     self.file.write("    pigment { " +
  238.                                     "color rgb <%s, %s, %s> }\n" %
  239.                                     (material.R, material.G, material.B))
  240.                     self.file.write("    finish { Phong_Glossy }\n")
  241.                     self.file.write("}\n")
  242.  
  243.     def writeObject(self, name):
  244.         if Blender.isLamp(name) or Blender.isMesh(name):
  245.             self.writeIdentifier(name)
  246.             object = Blender.getObject(name)
  247.             povname = string.replace(object.data, ".", "_")
  248.             povname = string.upper(povname)
  249.             self.file.write("    object { %s\n" % povname)
  250.             if not object.materials:
  251.                 self.file.write("        texture {\n")
  252.                 self.file.write("            pigment { " +
  253.                                 "color rgb <1, 1, 1> }\n")
  254.                 self.file.write("            finish { Phong_Glossy }\n")
  255.                 self.file.write("}\n")
  256.             self.file.write("        matrix <%s, %s, %s,\n" %
  257.                             (object.matrix[0][0],
  258.                              object.matrix[0][1],
  259.                              object.matrix[0][2]))
  260.             self.file.write("                %s, %s, %s,\n" %
  261.                             (object.matrix[1][0],
  262.                              object.matrix[1][1],
  263.                              object.matrix[1][2]))
  264.             self.file.write("                %s, %s, %s,\n" %
  265.                             (object.matrix[2][0],
  266.                              object.matrix[2][1],
  267.                              object.matrix[2][2]))
  268.             self.file.write("                %s, %s, %s>\n" %
  269.                             (object.matrix[3][0],
  270.                              object.matrix[3][1],
  271.                              object.matrix[3][2]))
  272.             self.file.write("    }\n")
  273.  
  274.     def writeWorld(self):
  275.         # materials
  276.         for name in self.scene.objects:
  277.             if not Blender.isCamera(name):
  278.                 self.writeMaterial(name)
  279.         # first write the data before ...
  280.         for name in self.scene.objects:
  281.             if not Blender.isCamera(name):
  282.                 self.writeData(name)
  283.         # ... you use it with the objects
  284.         self.file.write("union {\n")
  285.         for name in self.scene.objects:
  286.             if Blender.isLamp(name):
  287.                 self.writeObject(name)
  288.         for name in self.scene.objects:
  289.             if not Blender.isCamera(name) and not Blender.isLamp(name):
  290.                 self.writeObject(name)
  291.         # rotate scene with inverse camera matrix
  292.         camobj = self.scene.getCurrentCamera()
  293.         camera = Blender.getCamera(camobj.data)
  294.         self.file.write("    matrix <%s, %s, %s,\n" %
  295.                         (camobj.inverseMatrix[0][0],
  296.                          camobj.inverseMatrix[0][1],
  297.                          camobj.inverseMatrix[0][2]))
  298.         self.file.write("            %s, %s, %s,\n" %
  299.                         (camobj.inverseMatrix[1][0],
  300.                          camobj.inverseMatrix[1][1],
  301.                          camobj.inverseMatrix[1][2]))
  302.         self.file.write("            %s, %s, %s,\n" %
  303.                         (camobj.inverseMatrix[2][0],
  304.                          camobj.inverseMatrix[2][1],
  305.                          camobj.inverseMatrix[2][2]))
  306.         self.file.write("            %s, %s, %s>\n" %
  307.                         (camobj.inverseMatrix[3][0],
  308.                          camobj.inverseMatrix[3][1],
  309.                          camobj.inverseMatrix[3][2]))
  310.         self.file.write("}\n")
  311.  
  312. povexport = PovrayExport("test")
  313. scene = Blender.getCurrentScene()
  314. povexport.export(scene)
  315.